package 双指针;

import java.util.ArrayList;

/**
 * @author admin
 * @version 1.0.0
 * @ClassName 无重复字符的最长子串.java
 * @Description TODO
 * @createTime 2020年10月18日 12:29:00
 * 给定一个字符串，请你找出其中不含有重复字符的 最长子串 的长度。
 *
 * 示例 1:
 *
 * 输入: "abcabcbb"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 * 示例 2:
 *
 * 输入: "bbbbb"
 * 输出: 1
 * 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
 *
 * 思路：滑动窗口 每次检测窗口中是否含有这个字符 如果有则缩小窗口 如果没有则扩大窗口
 *      每次记录最大值
 */
public class 无重复字符的最长子串 {
  public static   String s="abcabcbb";
    public static void main(String[] args) {
        //方法1
//        public int lengthOfLongestSubstring(String s) {
//            if (s.length() == 0)
//                return 0;
//            HashMap<Character, Integer> map = new HashMap<>();
//            int max = 0;
//            for (int i = 0, j = 0; i < s.length(); ++i) {

//                if (map.containsKey(s.charAt(i))) {
//                    j = Math.max(j, map.get(s.charAt(i)) + 1);
//                }
//                map.put(s.charAt(i), i);
//                max = Math.max(max, i - j + 1);
//            }
//            return max;
//        }


//方法2
//        public int lengthOfLongestSubstring(String s) {
//            int res = 0;
//            Set<Character> set = new HashSet<>();
//            for(int l = 0, r = 0; r < s.length(); r++) {
//                char c = s.charAt(r);
//                while(set.contains(c)) {
//                    set.remove(s.charAt(l++));
//                }
//                set.add(c);
//                res = Math.max(res, r - l + 1);
//            }
//
//            return res;
//        }

//方法3
//        int lengthOfLongestSubstring(string s) {
//            if (s.length() == 0 || s.length() == 1){
//                return s.length();
//            }
//
//            int start = 0;
//            int maxLength = 0;
//            for (int i=1; i<s.length(); i++) {
//                // 判断是否有重复
//                for (int j=start; j<i; j++) {
//                    if (s[j] == s[i]) {
//                        //重复，需要重新指定起始位置
//                        start = j+1;
//                        break;
//                    }
//                }
//
//                //重新计算长度
//                maxLength = max(maxLength,i-start+1);
//            }
//            return maxLength;
        }
}
